import config
import requests
import os
from telegram import Update, InputFile
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
from gtts import gTTS
from pydub import AudioSegment


# Путь к папке, где установлен ffmpeg
ffmpeg_path = r'C:\ffmpeg'
os.environ["PATH"] += os.pathsep + ffmpeg_path


# обработчик команды /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text(f"Привет, {update.effective_user.first_name},"
                                    f" я бот!")


# обработчик команды /help
async def help(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text("Доступные команды: \n/start - запуск бота\n"
                                    "/help - cписок доступных команд\n"
                                    "/cat - случайное изображение кота")


# получение цитаты дня с сайта https://theysaidso.com
def get_quote():
    url = 'https://quotes.rest/qod?category=management'
    api_token = config.THEYSAIDSO_TOKEN
    headers = {'content-type': 'application/json',
               'X-TheySaidSo-Api-Secret': format(api_token)}
    response = requests.get(url, headers=headers)
    #print(response.json())
    quote = response.json()['contents']['quotes'][0]['quote']
    author = response.json()['contents']['quotes'][0]['author']
    permalink = response.json()['contents']['quotes'][0]['permalink']
    background_url = response.json['contents']['quotes'][0]['background']
    quote_str = quote + "\n" + author + "\n" + permalink
    return quote_str, background_url


# получение случайного изображения котика с сайта https://thecatapi.com
def get_cat_image_url():
    url = "https://api.thecatapi.com/v1/images/search"
    response = requests.get(url)
    image_url = response.json()[0]['url']
    return image_url


# функция генерации изображения
def generate_image(text):
    image = Image.new(mode="RGB", size=(500, 500), color=(255, 255, 255))
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("arial.ttf", 30)
    draw.text((50, 50), text, fill=(0, 0, 0), font=font)
    return image


# функция преобразования текста в речь
def text_to_speech(text, lang):
    speech = gTTS(text=text, lang=lang, slow=False)
    buffer = BytesIO()
    speech.write_to_fp(buffer)
    buffer.seek(0)
    audio = AudioSegment.from_file(buffer, format="mp3")
    return audio


# обработчик команды /quote
async def quote(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    quote, image_url = get_quote()
    await update.message.reply_text(quote)
    await update.message.reply_photo(image_url)


# обработчик команды /cat
async def cat(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    image_url = get_cat_image_url()
    await update.message.reply_photo(image_url)


# обработчик команды /image
async def send_image(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    text = update.message.text
    image_text = ' '.join(text.split(' ')[1:])
    image = generate_image(image_text)
    buffer = BytesIO()
    image.save(buffer, 'PNG')
    buffer.seek(0)
    await update.message.reply_photo(buffer)


# обработчик команды |speak
async def speak(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    text = update.message.text
    lang = text.split(' ')[1]
    msg = ' '.join(text.split(' ')[2:])
    buffer = BytesIO()
    audio = text_to_speech(msg, lang)
    audio.export(buffer, format="mp3")
    buffer.seek(0)
    input_file = InputFile(buffer, filename="speech.mp3")
    await context.bot.send_audio(chat_id=update.effective_chat.id,
                                 audio=input_file)


# объект бота
app = ApplicationBuilder().token(config.TOKEN).build()
# перехват команды /start
app.add_handler(CommandHandler("start", start))
# перехват команды /help
app.add_handler(CommandHandler("help", help))
# перехват команды /quote
app.add_handler(CommandHandler("quote", quote))
# перехват команды /cat
app.add_handler(CommandHandler("cat", cat))
# перехват команды /image
app.add_handler(CommandHandler("image", send_image))
# перехват команды /speak
app.add_handler(CommandHandler("speak", speak))
# запуск бота
app.run_polling()
